<?php

namespace app\common\model\mall\oper;

use think\Model;
use fast\Tree;
use think\Cache;

class Area extends Model
{
    // 表名
    protected $name = 'area';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = false;

    // 定义时间戳字段名
    protected $createTime = false;
    protected $updateTime = false;
    
    // 追加属性
    protected $append = [
        'level_text'
    ];

    protected static function init()
    {

    }

    public function getLevelList()
    {
        return [1 => __('Level 1'),2 => __('Level 2'),3 => __('Level 3'),4 => __('Level 4')];
    }     

    public function getLevelTextAttr($value, $data)
    {        
        $value = $value ? $value : (isset($data['level']) ? $data['level'] : '');
        $list = $this->getLevelList();
        return isset($list[$value]) ? $list[$value] : '';
    }

    /**
     * 获取树类实例
     *
     * @param bool $isParents 是否获取所有父级（用于编辑）
     * @return Array
     */
    public static function getTreeArray($isParents = true)
    {
        if($isParents){
            $list = collection(self::where("level","<", self::max("level"))->order('first')->field("id,pid,name,level")->select())->toArray();

        }else{
            $list = collection(self::order('first')->field("id,pid,name,level")->select())->toArray();
        }
        Tree::instance()->init($list);
        return Tree::instance()->getTreeArray(0);

    }

    /**
     * 获取树列表
     *
     * @param bool $isParents 是否获取所有父级（用于编辑）
     * @param array $selected 选择的节点ID（用于编辑）
     * @return Array
     */
    public static function getTreeList($isParents = true, $selected = [])
    {
        $list = Tree::instance()->getTreeList(self::getTreearray($isParents), 'name');
        return $list;
    }

    public function getChild($selected = [])
    {
        $child = collection(self::where("pid","in",$selected)->order('first')->field("id,pid,name,level")->select())->toArray();
        return $child;
    }

    /**
     * 根据经纬度获取当前地区信息
     *
     * @param string $lng 经度
     * @param string $lat 纬度
     * @return Area 城市信息
     */
    public static function getAreaFromLngLat($lng, $lat, $level = 3)
    {
        $namearr = [1 => 'geo:province', 2 => 'geo:city', 3 => 'geo:district'];
        $rangearr = [1 => 15000, 2 => 1000, 3 => 200];
        $geoname = isset($namearr[$level]) ? $namearr[$level] : $namearr[3];
        $georange = isset($rangearr[$level]) ? $rangearr[$level] : $rangearr[3];
        // 读取范围内的ID
        $redis = Cache::store('redis')->handler();
        $georadiuslist = [];
        if (method_exists($redis, 'georadius')) {
            $georadiuslist = $redis->georadius($geoname, $lng, $lat, $georange, 'km', ['WITHDIST', 'COUNT' => 5, 'ASC']);
        }

        if ($georadiuslist) {
            list($id, $distance) = $georadiuslist[0];
        }
        $id = isset($id) && $id ? $id : 3;
        return self::get($id);
    }

    /**
     * 根据经纬度获取省份
     *
     * @param string $lng 经度
     * @param string $lat 纬度
     * @return Area
     */
    public static function getProvinceFromLngLat($lng, $lat)
    {
        $provincedata = null;
        $citydata = self::getCityFromLngLat($lng, $lat);
        if ($citydata) {
            $provincedata = self::get($citydata['pid']);
        }
        return $provincedata;
    }

    /**
     * 根据经纬度获取城市
     *
     * @param string $lng 经度
     * @param string $lat 纬度
     * @return Area
     */
    public static function getCityFromLngLat($lng, $lat)
    {
        $citydata = null;
        $districtdata = self::getDistrictFromLngLat($lng, $lat);
        if ($districtdata) {
            $citydata = self::get($districtdata['pid']);
        }
        return $citydata;
    }

    /**
     * 根据经纬度获取地区
     *
     * @param string $lng 经度
     * @param string $lat 纬度
     * @return Area
     */
    public static function getDistrictFromLngLat($lng, $lat)
    {
        $districtdata = self::getAreaFromLngLat($lng, $lat, 3);
        return $districtdata;
    }

    /**
     * 根据父分类获取其下所有子分类[包括自己]
     * @param string $ids
     */
    public static function getChildIds($ids,$data = []){
        $data = array_merge($data,$ids);
        $rs = self::where('pid','in',$ids)->column('id');
        if(count($rs)>0){
            return self::getChildIds($rs,$data);
        }else{
            return $data;
        }
    }

    /**
     * 根据子分类获取其父级分类
     * @param string $id
     */
    public static function getParentIds($id,$data = array()){
        $data[] = $id;
        $parentId = self::where('id',$id)->value('pid');
        if($parentId==0){
            krsort($data);
            return $data;
        }else{
            return self::getParentIds($parentId, $data);
        }
    }

    /**
     * 获取自己以及父级的地区名称
     */
    public static function getParentNames($id,$data = array()){
        $areas = self::where('id',$id)->field('pid,name')->find();
        $data[] = $areas['name'];
        if((int)$areas['pid']==0){
            krsort($data);
            return $data;
        }else{
            return self::getParentNames((int)$areas['pid'], $data);
        }
    }

    /**
     * 根据ids获取地区名称s
     * @param array $ids
     * @return string
     */
    public static function getNamesByIds($ids)
    {
        $names = self::where('id', 'in', $ids)->column('name');
        return $names ? implode('',$names) : "";
    }

}
